SCYLLA(唸作斯庫拉),英文字面上是指希拉神話的女海妖,用C++寫成的開源專案,目前最新出到版本:4.0,團隊目前還是以3.x為主,所以接下來並不會討論到4.0的一些功能或調整。
介紹SCYLLA,一定得要先介紹CASSANDRA,因為SCYLLA是出脫於CASSANDRA 。
CASSANDRA 是源自facebook開發團隊,設計的一套分散式、去中心化,可高度擴展性的NoSQL DB。
後續會針對這個分散式DB個架構概念,跟大家做更詳細的描述。
簡單來說,SCYLLA就是有一群人用C++,把用JAVA寫出來的CASSANDRA重新覆寫一遍,所以大體上了解CASSANDRA,就是了解SCYLLA。
有點點像是Maria DB與MySQL的關係。
SCYLLA號稱完全兼容CASSANDRA,當然或許可能有少少的功能,處理方式和CASSANDRA不太一樣,就筆者了解的部分,會特別說明出來。
SCYLLA 告訴大家它是最快的NoSQL DB
,效能優異程度十足碾壓原本的CASSANDRA,我們來看一下官網提供的數據。
Scylla vs Cassandra Using 2TB Data for Different YCSB Workloads – Database Benchmark
4-node Scylla 2.2 (i3.metal) vs 40-node Cassandra 3.11 (i3.4xlarge) – Database Benchmark
SCYALLA 可以發揮遠勝於CASSANDRA的效能,是在對於各方面都下足了苦工夫,不管是程式語言特性,語言框架的選用,CPU效能、Memory的控制、網路TCP上的調教、I/O disk的處理等等,筆者簡單挑了3個自己覺得比較有興趣項目,稍微跟大家在下面提一下。
SCYLLA 使用Seastar框架, Seastar是C++近年發展出來的一種高性能框架,得益於此框架可以更充分運用目前的硬體效能,因此能夠發揮更好的處理效益。
Seastar 是個事件驅動框架(event-trigger framework),並且異步處理(asynchronous),SCYLLA說道目前硬體是以異步方式工作,但是沒有一個可異步處理處理的『軟體』,就無法充分發會其效能,這個軟體就是Seastar。
所以SCYLLA 以異步處理為主軸,Seastar未能及的部分,也是以異步處理去做設計。
官方有一段FAQ非常有意思,如下面所敘
I understood Scylla underline Seastar framework use one thread per core, but I see more than two threads per core¶
Seastar creates an extra thread per core for blocking syscalls (like open()/ fsync() / close() ); this allows the Seastar reactor to continue executing while a blocking operation takes place. Those threads are usually idle, so they don’t contribute to significant context switching activity.
意思是說基本上一個cpu core 會開一個thread,但是scylla會多開一個thread。
作業系統基本原理是遇到blocking syscall,要嘛thread就被置換出去,要嘛idle在那邊傻傻乾耗,scylla多出的一個thread就可以專業handle這些會block的的操作,讓原本的thread充分利用CPU分配給它的時間。
這點感覺很像golang的goroutine處理,不浪費在thread context switch 上面,或者傻傻idle不做事。
SCYLLA 在對於硬碟的I/O處理上,大體上是建立一個workload的機制,定時偵測讀寫硬碟的延遲時間,去推算最大的可以併發處理request,若request數量大於硬碟可併發處理數量,I/O scheduler會讓後面的request連硬碟都不要進,先在外面排隊,以達到最好的處理效益。
ScyllaDB Database Benchmarks
Scylla FAQ
The Scylla I/O Scheduler – Better Latencies Under Any Circumstance